package gui_kalenderpanel;
import java.awt.*;
import Logg_Inn.*;
import model.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.border.BevelBorder;

public class AvtalePanel extends JPanel{
	
	JButton nyAvtale;
	JButton slett;
	JButton lagre;
	JButton avbryt;
	JButton endre;
	JButton godta;
	JButton forkast;
	String tilstand;
	String[] tilstander = {"vis", "endre", "beskjed", "vis annen"};
	GridBagLayout layout;
	GridBagConstraints c;
	JLabel empty;
	boolean sletting = false;
	Bruker bruker;
	KalenderKontroll kalenderKontroll;
	PropertyChangeSupport pcs;
	int endringen;
	InnholdsPanel innhold;
	
	public AvtalePanel(KalenderKontroll kalkont, Bruker brukerTemp) {
		layout = new GridBagLayout();
		setLayout(layout);
		c = new GridBagConstraints();
		pcs = new PropertyChangeSupport(this);
		tilstand = "vis";
		bruker = brukerTemp;
		kalenderKontroll = kalkont;
		endringen = 0;
		c.anchor = GridBagConstraints.WEST;
		c.insets = new Insets(2,2,2,2);
		c.ipadx = 25;
		c.fill = GridBagConstraints.HORIZONTAL;
		
		nyAvtale = new JButton("Ny Avtale");
		nyAvtale.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				innhold.empty();
				Avtale temp = new Avtale();
				//temp.setId(noe);	//finn ut om sette id for ny avtale
				ArrayList<Deltager> deltagere = new ArrayList();
				temp.setDeltagere(deltagere);
				innhold.setCurrent(temp);
				innhold.setNyAv(0);
				skjiftTilstand("endre");
				endringen = 0;
			}
		});
		c.gridx = 0;
		c.gridy = 0;
		add(nyAvtale, c);
		
		innhold = new InnholdsPanel(kalenderKontroll);
		innhold.setBorder(new BevelBorder(BevelBorder.LOWERED));
		c.gridy = 1;
		c.gridwidth = 3;
		add(innhold, c);
		c.gridwidth = 1;
		
		endre = new JButton("Endre");
		endre.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (innhold.getCurrent() != null) {
					innhold.setNyAv(1);
					skjiftTilstand("endre");
					endringen = 1;
				}
			}
		});
		c.gridy = 2;
		add(endre, c);
		
		slett = new JButton("Slett");
		slett.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (innhold.getCurrent() != null) {
					Avtale av = innhold.getCurrent();
					ArrayList<Deltager> tempity = av.getDeltagere();
					for (int i = 0; i < tempity.size(); i++) {
						if (tempity.get(i).getNavn() == bruker.getNavn()) {
							av.getDeltagere().get(i).setStatus(Status.forkastet);
							break;
						}
					}
					Melding_Slett meld = new Melding_Slett();
					meld.addPropertyChangeListener(new PropertyChangeListener() {
						public void propertyChange(PropertyChangeEvent evt) {
							if (evt.getPropertyName() == "godtatt") {
								bruker.fjernAvtale(innhold.getCurrent());
								skjiftTilstand("vis");
								String komment = (String) evt.getNewValue();
								if (innhold.getCurrent().getMote()) {
									if (innhold.getCurrent().getEier().equals(bruker.getNavn())) {
										ArrayList<Deltager> temp = innhold.getCurrent().getDeltagere();
										String[] til = new String[temp.size()];
										int i = 0;
										for (Deltager n: temp) {
											til[i++] = n.getNavn();
										}
										kalenderKontroll.sendBeskjed(new Beskjed(BeskjedType.avlysning, komment, innhold.getCurrent(), til, bruker.getNavn()));
									}
									else {
										String[] til = new String[1];
										til[0] = innhold.getCurrent().getEier();
										kalenderKontroll.sendBeskjed(new Beskjed(BeskjedType.avslag,  komment, innhold.getCurrent(), til, bruker.getNavn()));
									}
								}
								
								innhold.empty();
							}
							else if (evt.getPropertyName() == "avbrutt") {
								sletting = false;
							}
						}
					});
				}
			}
		});
		c.gridx = 1;
		add(slett, c);
		
		avbryt = new JButton("Avbryt");
		avbryt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (innhold.getCurrent() != null) {
					innhold.empty();
					skjiftTilstand("vis");
				}
			}
		});
		c.gridx = 2;
		add(avbryt, c);
		
		lagre = new JButton("Lagre");
		lagre.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//lagre avtale
				if (innhold.sjekk()) {
					Avtale avtale = innhold.getAvtale();
					avtale.setEier(bruker.getNavn());
					bruker.leggeTilAvtale(avtale);
					skjiftTilstand("vis");
					innhold.current = avtale;
					if (avtale.getMote()) {
						System.out.println("WIII!");
						ArrayList<Deltager> temp = avtale.getDeltagere();
						String[] til = new String[temp.size()];
						int i = 0;
						for (Deltager n: temp) {
							til[i++] = n.getNavn();
						}
						
						
						if (endringen == 1) {
							Beskjed innkalling = new Beskjed(BeskjedType.endring, "Komment", avtale, til, bruker.getNavn());
							kalenderKontroll.sendBeskjed(innkalling);
						}
						else if (endringen == 0) {
							Beskjed innkalling = new Beskjed(BeskjedType.innkalling, "Komment", avtale, til, bruker.getNavn());
							kalenderKontroll.sendBeskjed(innkalling);
						}
						
						
					}
				}
				else {
					ikkeGyldig();
				}
			}
		});
		
		godta = new JButton("Godta");
		godta.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Avtale avtale = innhold.getCurrent();
				ArrayList<Deltager> tempity = avtale.getDeltagere();
				for (int i = 0; i < tempity.size(); i++) {
					if (tempity.get(i).getNavn() == bruker.getNavn()) {
						avtale.getDeltagere().get(i).setStatus(Status.godtatt);
						break;
					}
				}

				
				bruker.leggeTilAvtale(avtale);
				innhold.empty();
				innhold.setAvtale(avtale);
				innhold.current = avtale;
				skjiftTilstand("vis annen mote");
			}
		});
		forkast = new JButton("Forkast");
		forkast.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//sett sammen beskjeden
				String[] til = new String[1];
				til[0] = innhold.getCurrent().getEier();
				kalenderKontroll.sendBeskjed(new Beskjed(BeskjedType.avslag, "Jeg avslo", innhold.getCurrent(), til, bruker.getNavn()));
				//oppdater motet om forkastning
				Avtale avTemp = innhold.getAvtale();
				ArrayList<Deltager> tempity = avTemp.getDeltagere();
				for (int i = 0; i < tempity.size(); i++) {
					if (tempity.get(i).getNavn() == bruker.getNavn()) {
						avTemp.getDeltagere().get(i).setStatus(Status.forkastet);
						break;
					}
				}
				innhold.empty();
				skjiftTilstand("vis");
			}
		});
		empty = new JLabel();
		empty.setPreferredSize(new Dimension(70,20));
		
		innhold.activate(false);
	}
	
	public void skjiftTilstand(String nyTilstand) {
		tilstand = nyTilstand;
		layout.removeLayoutComponent(endre);
		layout.removeLayoutComponent(slett);
		layout.removeLayoutComponent(avbryt);
		layout.removeLayoutComponent(lagre);
		layout.removeLayoutComponent(godta);
		layout.removeLayoutComponent(forkast);
		layout.removeLayoutComponent(empty);
		remove(endre);
		remove(slett);
		remove(avbryt);
		remove(lagre);
		remove(godta);
		remove(forkast);
		remove(empty);
		revalidate();
		if (nyTilstand == "vis") {
			c.gridx = 0;
			c.gridy = 2;
			add(endre, c);
			c.gridx = 1;
			add(slett, c);
			c.gridx = 2;
			add(avbryt, c);
			innhold.activate(false);
		}
		else if (nyTilstand == "endre") {
			c.gridx = 0;
			c.gridy = 2;
			add(lagre, c);
			c.gridx = 1;
			add(empty, c);
			c.gridx = 2;
			add(avbryt, c);
			innhold.activate(true);
		}
		else if (nyTilstand == "beskjed") {
			c.gridx = 0;
			c.gridy = 2;
			add(godta, c);
			c.gridx = 1;
			add(forkast, c);
			c.gridx = 2;
			add(avbryt, c);
			innhold.activate(false);
		}
		else if (nyTilstand == "vis annen") {
			c.gridx = 0;
			c.gridy = 2;
			add(avbryt, c);
			innhold.activate(false);
		}
		else if (nyTilstand == "vis annen mote") {
			c.gridx = 0;
			c.gridy = 2;
			add(slett, c);
			c.gridx = 1;
			add(avbryt, c);
		}
	}
	
	
	
	public void setAvtale(Avtale denne) {
		innhold.empty();
		innhold.setAvtale(denne);
		innhold.setCurrent(denne);
		System.out.println(innhold.getCurrent());
	}
	
	public Avtale getAvtale() {
		return innhold.getCurrent();
	}
	
	public void ikkeGyldig() {
		JFrame frame = new JFrame("OBS!");
		frame.setLayout(new BorderLayout());
		JLabel labe = new JLabel("Avtalen din er ikke gyldig!");
		JLabel labe2 = new JLabel("Den maa ha en beskrivelse og et sted.");
		frame.add(labe, BorderLayout.CENTER);
		frame.add(labe2, BorderLayout.SOUTH);
		frame.setSize(400,100);
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		
	}
	
	public void addPropertyChangeListener(PropertyChangeListener listener) {
		pcs.addPropertyChangeListener(listener);
	}
	
	public String getTilstand() {
		return tilstand;
	}
}


